package com.springboot.service;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.math.BigDecimal;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import java.util.Calendar;

import java.util.Collections;

import java.util.Date;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import com.springboot.dao.OrderzMapper;

import com.springboot.entity.Orderz;

import com.springboot.entity.OrderzExample;

import com.springboot.entity.*;
import com.springboot.dao.*;
import com.springboot.entity.User;

import com.springboot.entity.UserExample;

import com.springboot.dao.UserMapper;

import com.springboot.entity.Furniture;

import com.springboot.entity.FurnitureExample;

import com.springboot.dao.FurnitureMapper;

import com.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.multipart.MultipartFile;

@Service

public class OrderzService implements OrderzServiceImp {


    private static final Log logger = LogFactory.getLog(OrderzService.class);

    @Autowired
    private OrderzMapper orderzdao;
// 定义userdao参数  


    @Autowired
    private UserMapper userdao;
// 定义furnituredao参数  


    @Autowired
    private FurnitureMapper furnituredao;


    //定义方法addorderz,响应控制层addorderz请求

    public void addorderz(HttpServletRequest request, HttpSession session) {

        //输出日志，当前执行方法为addorderz

        logger.debug("OrderzService.addorderz ......");

// 定义 example1为 UserExample的实例

        UserExample example1 = new UserExample();

// 定义userall的List使用 userdao的selectByExample方法查询所有订单数据

        List userall = userdao.selectByExample(example1);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("userall", userall);

// 定义 example2为 FurnitureExample的实例

        FurnitureExample example2 = new FurnitureExample();

// 定义furnitureall的List使用 furnituredao的selectByExample方法查询所有订单数据

        List furnitureall = furnituredao.selectByExample(example2);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("furnitureall", furnitureall);


    }


    //定义useraddorderz方法，在订单控制层中调用

    public void useraddorderz(HttpServletRequest request, HttpSession session) {

        //输出日志，表示当前正在执行OrderzService.useraddorderz方法

        logger.debug("OrderzService.useraddorderz ......");

// 定义 example1为 UserExample的实例

        UserExample example1 = new UserExample();

// 定义userall的List使用 userdao的selectByExample方法查询所有订单数据

        List userall = userdao.selectByExample(example1);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("userall", userall);

// 定义 example2为 FurnitureExample的实例

        FurnitureExample example2 = new FurnitureExample();

// 定义furnitureall的List使用 furnituredao的selectByExample方法查询所有订单数据

        List furnitureall = furnituredao.selectByExample(example2);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("furnitureall", furnitureall);


    }


    // 定义userupdateorderz方法

    public void userupdateorderz(HttpServletRequest request, HttpSession session, int id) {

        // 输出日志OrderzService.userupdateorderz

        logger.debug("OrderzService.userupdateorderz ......");


        // 实例化订单,使用orderzdao的selectByPrimaryKey方法通过id查询订单

        Orderz orderz = orderzdao.selectByPrimaryKey(id);


// 定义 example1为 UserExample的实例

        UserExample example1 = new UserExample();

// 定义userall的List使用 userdao的selectByExample方法查询所有订单数据

        List userall = userdao.selectByExample(example1);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("userall", userall);

// 定义 example2为 FurnitureExample的实例

        FurnitureExample example2 = new FurnitureExample();

// 定义furnitureall的List使用 furnituredao的selectByExample方法查询所有订单数据

        List furnitureall = furnituredao.selectByExample(example2);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("furnitureall", furnitureall);


        // 将查询出的订单信息保存到request中

        request.setAttribute("orderz", orderz);


    }


    //定义userorderzmanage方法

    public void userorderzmanage(HttpServletRequest request, HttpSession session) {

        //输出日志 ，表示当前正在执行方法为OrderzService.userorderzmanage

        logger.debug("OrderzService.userorderzmanage ......");


        //定义实体，从session中获取当前用户，赋值给

        User user = (User) session.getAttribute("userinfo");


        //实例化订单类为example

        OrderzExample example = new OrderzExample();


        //实例化订单Example类的criteria

        OrderzExample.Criteria criteria = example.createCriteria();

        // 通过 criteria设置查询条件Userid为当前用户id

        criteria.andUseridEqualTo(user.getId());


        // 使用 orderzdao.selectByExample(example)方法查询所有userid为当前用户id的订单

        List orderzall = orderzdao.selectByExample(example);

        // 将查询的订单数据保存到request中的 orderzall参数中


        request.setAttribute("orderzall", orderzall);
    }


    //定义useraddorderzact，响应页面添加请求

    public void useraddorderzact(HttpServletRequest request, HttpSession session, Orderz orderz) throws IOException {

        //输出日志，表示当前正在执行方法为OrderzService.useraddorderzact

        logger.debug("OrderzService.useraddorderzact ......");

        //使用mybatis逆向工程所提供的insert方法添加订单数据到数据库中

        orderzdao.insert(orderz);


        //将添加订单成功的信息保存到request中，在页面中进行初始化

        request.setAttribute("message", "添加订单成功");

    }


    //定义addorderzact方法

    public void addorderzact(HttpServletRequest request, HttpSession session, Orderz orderz) throws IOException {

        //输出当前方法日志，表示正在执行OrderzService.addorderzact方法

        logger.debug("OrderzService.addorderzact ......");

        //使用orderzdao的insert方法将订单添加到数据库中

        orderzdao.insert(orderz);


        //将添加订单信息添加到request中用message参数进行保存

        request.setAttribute("message", "添加订单成功");

    } //定义addorderzactjson方法

    public void addorderzactjson(Orderz orderz) throws IOException {

        //输出当前方法日志，表示正在执行OrderzService.addorderzactjson方法

        logger.debug("OrderzService.addorderzactjson ......");

        //使用orderzdao的insert方法将订单添加到数据库中

        orderzdao.insert(orderz);

    }


    //定义orderzmanage方法响应页面请求

    public void orderzmanage(HttpServletRequest request, HttpSession session) {

        //输出日志，表示当前正在执行OrderzService.orderzmanage

        logger.debug("OrderzService.orderzmanage ......");


        //实例化OrderzExample类为example

        OrderzExample example = new OrderzExample();


        //使用  orderzdao.selectByExample(example)方法获取所有的订单数据

        List orderzall = orderzdao.selectByExample(example);


        //将所有的订单数据保存到request中的orderzall参数里

        request.setAttribute("orderzall", orderzall);


    }


    // 定义 orderzview方法

    public void orderzview(HttpServletRequest request, HttpSession session) {

        // 输出日志，表示当前正在执行OrderzService.orderzview方法

        logger.debug("OrderzService.orderzview ......");


        // 实例化OrderzExample类

        OrderzExample example = new OrderzExample();


        // 使用orderzdao的selectByExample方法查询订单信息

        List orderzall = orderzdao.selectByExample(example);


        // 将查询的orderzall保存到request中，记录为参数orderzall

        request.setAttribute("orderzall", orderzall);


    }


    // 定义 updateorderz方法

    public void updateorderz(HttpServletRequest request, HttpSession session, int id) {

        // 输出日志OrderzController.updateorderz，表示正在执行该方法

        logger.debug("OrderzController.updateorderz ......");


        // 定义订单为biaoming，使用 orderzdao的selectByPrimaryKey方法通过id查询数据

        Orderz orderz = orderzdao.selectByPrimaryKey(id);


// 定义 example1为 UserExample的实例

        UserExample example1 = new UserExample();

// 定义userall的List使用 userdao的selectByExample方法查询所有订单数据

        List userall = userdao.selectByExample(example1);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("userall", userall);

// 定义 example2为 FurnitureExample的实例

        FurnitureExample example2 = new FurnitureExample();

// 定义furnitureall的List使用 furnituredao的selectByExample方法查询所有订单数据

        List furnitureall = furnituredao.selectByExample(example2);

        // 将上面查询到的订单数据保存到request中，返回页面

        request.setAttribute("furnitureall", furnitureall);


        // 将查询的订单保存到request中

        request.setAttribute("orderz", orderz);


    }


    // 定义userupdateorderzact方法

    public void userupdateorderzact(HttpServletRequest request, Orderz orderz, HttpSession session) throws IOException {

        // 当执行此方法时，输出此日志

        logger.debug("OrderzService.userupdateorderzact ......");

        // 调用orderzdao的updateByPrimaryKeySelective方法修改传入的orderz

        orderzdao.updateByPrimaryKeySelective(orderz);


        request.setAttribute("message", "修改订单信息成功");


    }
    // 定义updateorderzact处理订单修改

    public void updateorderzact(HttpServletRequest request, Orderz orderz, HttpSession session) throws IOException {

        // 输出日志，表示正在执行当前方法OrderzController.updateorderzact

        logger.debug("OrderzController.updateorderzact ......");

        // 执行orderzdao的updateByPrimaryKeySelective方法，将传入的订单数据同步到数据库中

        orderzdao.updateByPrimaryKeySelective(orderz);


        // 将修改成功信息保存到request中

        request.setAttribute("message", "修改订单信息成功");


    } // 定义updateorderzactjson处理订单修改

    public void updateorderzactjson(Orderz orderz) throws IOException {

        // 输出日志，表示正在执行当前方法OrderzController.updateorderzactjson

        logger.debug("OrderzController.updateorderzactjson ......");

        // 执行orderzdao的updateByPrimaryKeySelective方法，将传入的订单数据同步到数据库中

        orderzdao.updateByPrimaryKeySelective(orderz);

    }


    // 定义deleteorderz,处理删除订单

    public void deleteorderz(HttpServletRequest request, HttpSession session, int id) {

        // 输出日志，表示当前正在执行OrderzService.deleteorderz方法

        logger.debug("OrderzService.deleteorderz ......");

        //如果传入的id为-1，表示进行批量删除
        if (id == -1) {
            //实例化订单example
            OrderzExample example = new OrderzExample();
            //获取到传递过来的ids数据信息
            String ids = request.getParameter("ids");
            //为id信息添加-1数据，添加此数据可以防止数据为空时的报错
            ids += "-1,";
            //截取掉多余的逗号
            ids.substring(0, ids.length() - 1);
            //设置where语句进行删除id数据的传入
            //example.setWhere("id in ("+ ids +")");
            //实例化订单criteria
            OrderzExample.Criteria criteria = example.createCriteria();
            //设置integer类型的数组，保存需要删除的订单id信息
            List<Integer> idlist = new ArrayList();
            //根据id分离出需要删除的数据id信息
            String[] idarr = ids.split(",");
            //将对应的id数据信息保存到数组中
            for (int i = 0; i < idarr.length; i++) {
                //取出对应的id信息，并转换成int类型
                idlist.add(Integer.parseInt(idarr[i]));
            }
            //传入需要删除的id数组信息
            criteria.andIdIn(idlist);
            //调用订单的dao类，执行批量删除操作
            orderzdao.deleteByExample(example);
        } else {
            // 根据id调用orderzdao的deleteByPrimaryKey方法，删除订单


            orderzdao.deleteByPrimaryKey(id);

        }


        request.setAttribute("message", "删除订单成功");


    }


    // 定义userdeleteorderz方法

    public void userdeleteorderz(HttpServletRequest request, HttpSession session, int id) {

        // 输出日志，表示当前正在执行OrderzController.userdeleteorderz方法

        logger.debug("OrderzController.userdeleteorderz ......");


        // 调用orderzdao的deleteByPrimaryKey方法，传入id。删除id所对应的订单

        orderzdao.deleteByPrimaryKey(id);

        // 将删除订单成功信息保存到request中


        request.setAttribute("message", "删除订单成功");

    }


    // 定义searchorderz方法，处理搜索操作

    public void searchorderz(HttpServletRequest request, HttpSession session, String search) {

        // 输出日志，表示当前正在执行OrderzService.searchorderz

        logger.debug("OrderzService.searchorderz ......");


        // 实例化 OrderzExample

        OrderzExample example = new OrderzExample();

        // 实例化 OrderzExample的Criteria内部类

        OrderzExample.Criteria criteria = example.createCriteria();

        // 如果搜索内容不等于空

        if (search != null) {

            // 将搜索内容通过like关键字传到数据库中进行搜索

            criteria.andUserLike("%" + search + "%");

        }

        // 查询订单结果

        List orderzall = orderzdao.selectByExample(example);

        // 将查询到的订单 保存到request中进行保存

        request.setAttribute("orderzall", orderzall);

    }


    // 定义searchorderzjson方法，处理搜索操作

    public Map searchorderzjson(String search) {

        // 输出日志，表示当前正在执行OrderzService.searchorderzjson

        logger.debug("OrderzService.searchorderzjson ......");

        // 定义返回结果

        Map result = new HashMap();

        // 实例化 OrderzExample

        OrderzExample example = new OrderzExample();

        // 实例化 OrderzExample的Criteria内部类

        OrderzExample.Criteria criteria = example.createCriteria();

        // 如果搜索内容不等于空

        if (search != null) {

            // 将搜索内容通过like关键字传到数据库中进行搜索

            criteria.andUserLike("%" + search + "%");

        }

        // 查询订单结果

        List orderzall = orderzdao.selectByExample(example);

        // 将查询到的订单 保存到request中进行保存

        result.put("orderzall", orderzall);

        // 返回查询结果resultmap

        return result;

    }


    // 定义OrderzpinglunMapper

    public void orderzdetails(HttpServletRequest request, HttpSession session, int id) {

        // 输入日志信息，表名当前执行方法为OrderzController.orderzdetails

        logger.debug("OrderzController.orderzdetails ......");


        // 传入页面所传入的订单id使用orderzdao的selectByPrimaryKey方法进行查询

        Orderz orderz = orderzdao.selectByPrimaryKey(id);

        // 将查询到的订单保存到request中

        request.setAttribute("orderz", orderz);


    }


    // 定义Orderz详情方法

    public Map orderzdetailsjson(int id) {

        // 输入日志信息，表名当前执行方法为OrderzController.orderzdetailsjson

        logger.debug("OrderzController.orderzdetailsjson ......");


        // 定义返回结果

        Map result = new HashMap();

        // 传入页面所传入的订单id使用orderzdao的selectByPrimaryKey方法进行查询

        Orderz orderz = orderzdao.selectByPrimaryKey(id);

        // 将查询到的订单保存到result中

        result.put("orderz", orderz);


        // 返回查询结果resultmap

        return result;

    }


//	上传文件图片等

    public String uploadUtile(MultipartFile file, HttpServletRequest request) throws IOException {

        // 根据当前时间生成时间字符串

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");

        String res = sdf.format(new Date());

        // uploads文件夹位置

        String tomcatroot = request.getSession().getServletContext().getRealPath("resource/uploads/");
        String localroot = request.getServletContext().getRealPath("").split("out")[0] + "WebRoot/resource/uploads";
        System.out.println(tomcatroot);
        System.out.println(localroot);

        // 原始名称

        String originalFileName = file.getOriginalFilename();

        // 新文件名

        String newFileName = "sliver" + res + originalFileName.substring(originalFileName.lastIndexOf("."));

        // 创建年月文件夹

        Calendar date = Calendar.getInstance();

        File dateDirs = new File(date.get(Calendar.YEAR) + File.separator + (date.get(Calendar.MONTH) + 1));

        // 新文件

        File tomcatFile = new File(tomcatroot + File.separator + dateDirs + File.separator + newFileName);
        File localFile = new File(localroot + File.separator + dateDirs + File.separator + newFileName);

        // 判断目标文件所在目录是否存在

        if (!tomcatFile.getParentFile().exists()) {

            // 如果目标文件所在的目录不存在，则创建父目录

            tomcatFile.getParentFile().mkdirs();

        }
        // 判断目标文件所在目录是否存在

        if (!localFile.getParentFile().exists()) {

            // 如果目标文件所在的目录不存在，则创建父目录

            localFile.getParentFile().mkdirs();

        }

        file.transferTo(tomcatFile);

        String fileUrl = date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH) + 1) + "/" + newFileName;

        return fileUrl;

    }
}

